package com.cristina.attention.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.cristina.attention.base.BaseEntity;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 消息历史记录- 用户上线需要拉取消息记录, 每次拉取100条消息, 分页拉取
 * <p>私聊记录和群聊记录冗余在一起, 因为我给这个项目的定位就是百十来号人足矣. 私聊采用扩散写方式,群聊采用扩散读方式
 *  群消息只存储一份, 我能想到的解决方案是: 在 `GroupMember` 类中额外使用一个入群时间(into_time)字段, 拉取消息
 *  从这个游标时间节点之后开始倒序获取.
 *     select * from im_message where group_id = "" and send_time > (select into_time from im_group_member
 *     where group_id = "" and user_id = "")
 * </p>
 *
 * @author by Attention
 */
@Data
@TableName(value = "im_message")
@EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Message extends BaseEntity {

    /**
     * 字符串类型
     */
    public static final int TYPE_STR = 1;
    /**
     * 图片类型
     */
    public static final int TYPE_PIC = 2;
    /**
     * 文件类型
     */
    public static final int TYPE_FILE = 3;
    /**
     * 语音
     */
    public static final int TYPE_AUDIO = 4;

    @TableId
    @TableField(value = "message_id")
    private Long messageId;

    @TableField(value = "content")
    private String content;

    /**
     * 附件
     */
    @TableField(value = "attach")
    private String attach;

    /**
     * 消息类型
     */
    @TableField(value = "msg_type")
    private Integer msgType;

    /**
     * 发送者
     */
    @TableField(value = "send_id")
    private Long sendId;

    /**
     * 接收者
     */
    @TableField(value = "receiver_id")
    private Long receiverId;

    /**
     * 群id, 可为空
     */
    @TableField(value = "group_id")
    private Long groupId;

    /**
     * 是否本人发送
     * TODO 应该用 sendId 判断是不是本人发送的消息, 在前端项目中应该使用当前用户userId来和查询到的结果作比较
     * 该字段可能就冗余了
     */
    @TableField(value = "self")
    private Boolean self;

    /**
     * 消息发送时间
     */
    @TableField(value = "send_time")
    private Long sendTime;

    /**
     * 消息(群组消息/个人聊天/系统消息)
     */
    @TableField(value = "chat_type")
    private Integer chatType;
}
